// @Author: cyl
// @File: main.go
// @Time: 2024/06/26 22:10:28
package main

import (
	"fmt"
	"math"
	"unsafe"
)

func main() {
	/**
	固定长度的整型, 包括有符号整型或无符号整型, 什么是有符号和无符号整型呢?
		a. 计算机中的整数分为两类
			不带符号位的整数（unsigned integer, 也称为无符号整数）, 此类整数可以表示0和正整数；
			带符号位的整数（signed integer）, 此类整数可以表示正整数, 又可以表示负整数
		b. 无符号整数常用于表示地址、索引等正整数, 它们可以是8位、16位、32位、64位甚至更多;
		c. 8个二进制表示的正整数其取值范围是0~255（-1）, 16位二进制位表示的正整数其取值范围是0~65535（-1）, 32位二进制位表示的正整数其取值范围是0~-1
	go语言中int取值范围
		GO语言中int类型的大小是不确定的, 与具体的平台有关系
		一般来说, int在32位系统中是4字节, 在64位系统中是8字节
		使用自动推导类型初始化一个整数, 默认为int类型
	有符号整型范围
		Int8 - [-128 : 127]
		Int16 - [-32768 : 32767]
		Int32 - [-2147483648 : 2147483647]
		Int64 - [-9223372036854775808 : 9223372036854775807]
	无符号整型范围
		UInt8 - [0 : 255]
		UInt16 - [0 : 65535]
		UInt32 - [0 : 4294967295]
		UInt64 - [0 : 18446744073709551615]
	float
		一个float单精度浮点数一般是4bytes（32bit）来表示, 由三部分组成: 符号位、指数部分（表示2的多少次方）和尾数部分（小数点前面是0, 尾数部分只表示小数点后的数字）
		双精度64位, 单精度32位, 半精度自然是16位
		float32: 单精度浮点数float的这三部分所占的位宽分别为: 1, 8, 23
		float16: 半精度浮点数half的这三部分所占的位宽分别为: 1, 5, 10
	byte
		Byte 相当于byte(unsigned char) 0 ~ 255
	*/
	// 输出各int类型的取值范围
	fmt.Println("各int类型的取值范围为: ")
	fmt.Println("int8:", math.MinInt8, "~", math.MaxInt8)
	fmt.Println("int16:", math.MinInt16, "~", math.MaxInt16)
	fmt.Println("int32:", math.MinInt32, "~", math.MaxInt32)
	fmt.Println("int64:", math.MinInt64, "~", math.MaxInt64)
	fmt.Println()

	// n是自动推导类型
	n := 1234567890
	fmt.Printf("n := 1234567890 的默认类型为: %T\n", n)
	fmt.Printf("int类型的字节数为: ")
	fmt.Println(unsafe.Sizeof(n))
	fmt.Printf("\n")

	// 初始化一个32位整型值
	var a int32 = 987654321

	fmt.Println("var a int32 = 987654321")
	// 输出变量的十六进制形式和十进制值
	fmt.Printf("int32: 十六进制为0x%x, 十进制为%d\n", a, a)

	// 将a转换为int8类型, 发生数值截断
	b := int8(a)
	// 输出变量的十六进制形式和十进制值
	fmt.Printf("int8: 十六进制为0x%x, 十进制为%d\n", b, b)

	// 将a转换为int16类型, 发生数值截断
	c := int16(a)
	// 输出变量的十六进制形式和十进制值
	fmt.Printf("int16: 十六进制为0x%x, 十进制为%d\n", c, c)

	// 将a转换为int64类型
	d := int64(a)
	// 输出变量的十六进制形式和十进制值
	fmt.Printf("int64: 十六进制为0x%x, 十进制为%d\n", d, d)

	/**
	输出:
		各int类型的取值范围为：
		int8: -128 ~ 127
		int16: -32768 ~ 32767
		int32: -2147483648 ~ 2147483647
		int64: -9223372036854775808 ~ 9223372036854775807

		n := 1234567890 的默认类型为：int
		int类型的字节数为：8

		var a int32 = 987654321
		int32: 十六进制为0x3ade68b1, 十进制为987654321
		int8: 十六进制为0x-4f, 十进制为-79
		int16: 十六进制为0x68b1, 十进制为26801
		int64: 十六进制为0x3ade68b1, 十进制为987654321
	*/

	/**
	总结: 由于GO语言中各int类型的取值范围不同, 各int类型间进行数据转换时, 会存在数据截断的问题, 在使用过程中要引起注意!!!
	*/
}
